package com.xhj.mybatis.scripting.xmltags;

/**
 * IfSqlNode
 *
 * @author XJks
 * @description 用于在动态 SQL 生成过程中根据条件决定是否拼接 SQL 片段。
 */
public class IfSqlNode implements SqlNode {
    /**
     * 用于解析和计算表达式的工具类
     */
    private final ExpressionEvaluator evaluator;

    /**
     * 需要判断的条件表达式（如 "name != null"）
     */
    private final String test;

    /**
     * 条件成立时要执行的 SQL 节点（可以是其他 SQL 片段）
     */
    private final SqlNode contents;

    /**
     * 构造方法，初始化条件表达式、内容节点和表达式解析器
     *
     * @param contents 内容节点
     * @param test     条件表达式
     */
    public IfSqlNode(SqlNode contents, String test) {
        this.test = test;
        this.contents = contents;
        this.evaluator = new ExpressionEvaluator();
    }

    /**
     * apply 方法将当前节点应用到传入的 DynamicContext（动态上下文）中。
     *
     * @param context 包含正在构建的 SQL 文本、参数映射、变量等运行时信息。
     * @return 返回 true：表示该节点已成功应用，处理流程可以继续执行后续节点。返回 false：表示该节点决定停止后续节点的执行（例如 if/choose 条件不满足时）。
     */
    @Override
    public boolean apply(DynamicContext context) {
        // 使用表达式解析器判断 test 条件是否成立，context.getBindings() 获取当前上下文的参数
        if (evaluator.evaluateBoolean(test, context.getBindings())) {
            // 如果条件成立，则执行内容节点的 apply 方法，将 SQL 片段拼接到最终 SQL
            contents.apply(context);
            // 返回 true 表示条件成立并已处理
            return true;
        }
        // 如果条件不成立，什么都不做，返回 false
        return false;
    }

}
